{
 "nbformat": 4,
 "nbformat_minor": 0,
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "name": "pycharm-3ea5732f",
   "language": "python",
   "display_name": "PyCharm (ai_quant_trade)"
  },
  "language_info": {
   "name": "python"
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "source": [],
    "metadata": {
     "collapsed": false
    }
   }
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# 1. 安装依赖包，导入头文件"
   ],
   "metadata": {
    "id": "1oWbj4HgqHBg"
   }
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "id": "QJgoEYx3p_NG",
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "# 如果没有安装，解注释进行安装\n",
    "# !pip install -r requirements.txt\n",
    "\n",
    "## 请把下面解注释，安装finrl库\n",
    "# 或者把如下Github仓中的finrl文件夹考到根目录即可使用\n",
    "##!pip install git+https://github.com/AI4Finance-Foundation/FinRL.git\n",
    "\n",
    "# 强化学习库，使用stable_baselines3"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import datetime\n",
    "\n",
    "from finrl.meta.preprocessor.preprocessors import FeatureEngineer, data_split\n",
    "from finrl.meta.env_stock_trading.env_stocktrading import StockTradingEnv\n",
    "from finrl.agents.stablebaselines3.models import DRLAgent\n",
    "from stable_baselines3.common.logger import configure\n",
    "from finrl.meta.data_processor import DataProcessor\n",
    "from stable_baselines3 import A2C, DDPG, PPO, SAC, TD3\n",
    "\n",
    "%matplotlib inline\n",
    "from finrl.plot import backtest_stats, backtest_plot, get_daily_return, get_baseline\n",
    "from pprint import pprint"
   ],
   "metadata": {
    "id": "mqfBOKz-qJYF",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 91,
   "outputs": []
  },
  {
   "cell_type": "code",
   "source": [
    "from finrl import config  # 包含各类超参\n",
    "from finrl import config_tickers  # 常见各类市场股票代码集合，比如中证300\n",
    "import os\n",
    "from finrl.main import check_and_make_directories\n",
    "from finrl.config import (\n",
    "    DATA_SAVE_DIR,\n",
    "    TRAINED_MODEL_DIR,\n",
    "    TENSORBOARD_LOG_DIR,\n",
    "    RESULTS_DIR,\n",
    "    INDICATORS,\n",
    "    TRAIN_START_DATE,\n",
    "    TRAIN_END_DATE,\n",
    "    TEST_START_DATE,\n",
    "    TEST_END_DATE,\n",
    "    # TRADE_START_DATE,\n",
    "    # TRADE_END_DATE,\n",
    ")\n",
    "# 创建目录\n",
    "check_and_make_directories([TRAINED_MODEL_DIR, TENSORBOARD_LOG_DIR, RESULTS_DIR])"
   ],
   "metadata": {
    "id": "kyv8fz5rqM7H",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 63,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 2. 查看和加载数据"
   ],
   "metadata": {
    "id": "mUF2P4hmqVjh"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "# 读取训练数据，所有股票均混在了一个csv表里，格式如下\n",
    "# 索引     日期          股票\n",
    "#  0      2009-01-02    苹果\n",
    "#  0      2009-01-02    亚马逊\n",
    "#  1      2009-01-05    苹果\n",
    "#  1      2009-01-05    亚马逊\n",
    "\n",
    "# 注意：必须保持上述该格式，同样的索引下至少有2个数据，否则会报错，\n",
    "# 原因：\n",
    "#   1. 在finrl/meta/env_stock_trading/env_stocktrading.py的\n",
    "#      _initiate_state函数中self.data.close.values.tolist()，\n",
    "#      在404行，要求self.data.close必须是二维数组\n",
    "#   2. 而finrl/meta/env_stock_trading/env_stocktrading.py的\n",
    "#      __init__的64行self.data = self.df.loc[self.day, :]，\n",
    "#      如果索引顺序排，0，1，2。。。，会导致只取到一个行数，一维\n",
    "#      数据传入导致第1点中所述的问题\n",
    "#      （因此，如果只有一支股票时，需要把索引全部改成一样的，当然\n",
    "#      这种情况几乎不存在，也可以暂时忽略）\n",
    "# 解决方法：\n",
    "# 1. 降低numpy版本\n",
    "# 2. 把数据改成二维的，即（10，）-》（1，10） （改完是否存在回测不完整性，没有详细验证）\n",
    "# 3. 保持最上方所示的数据格式（推荐）\n",
    "\n",
    "TRADE_START_DATE = '2020-07-01'\n",
    "TRADE_END_DATE = '2021-10-29'\n",
    "\n",
    "processed_full = pd.read_csv(os.path.join(DATA_SAVE_DIR, 'full_data.csv'))\n",
    "\n",
    "train = pd.read_csv(os.path.join(DATA_SAVE_DIR, 'train_data.csv'))\n",
    "trade = pd.read_csv(os.path.join(DATA_SAVE_DIR, 'trade_data.csv'))\n",
    "\n",
    "train = train.set_index(train.columns[0])\n",
    "train.index.names = ['']\n",
    "assert train.shape[0] > 1, '数据必须至少包含2行，即2天以上'\n",
    "\n",
    "trade = trade.set_index(trade.columns[0]) # 第一列为索引\n",
    "trade.index.names = ['']\n",
    "assert trade.shape[0] > 1, '数据必须至少包含2行，即2天以上'"
   ],
   "metadata": {
    "id": "5huEX7kqqflJ",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 64,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bEv5KGC8h1jE"
   },
   "source": [
    "### 设置波动率阈值\n",
    "- 设置波动率阈值 > 样本内波动最大值的日期。\n",
    "- 如果当前的波动指数 > 阈值，我们认为当前市场波动性大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "id": "efwBi84ch1jE",
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "data_risk_indicator = processed_full[(processed_full.date<TRAIN_END_DATE) & (processed_full.date>=TRAIN_START_DATE)]\n",
    "insample_risk_indicator = data_risk_indicator.drop_duplicates(subset=['date'])  # 去重，仅保留一支股票\n",
    "pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "id": "VHZMBpSqh1jG",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "cb21619c-9da0-48c5-e423-82491774aad9",
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "count    1654.000000\nmean       16.473337\nstd         7.673456\nmin         9.140000\n25%        12.420000\n50%        14.210000\n75%        17.565000\nmax        82.690002\nName: vix, dtype: float64"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 66
    }
   ],
   "source": [
    "# 查看因子中的波动率 （vix是下载下来的数据）\n",
    "\n",
    "# 波动率解释查看：https://spglobal.com/spdji/zh/vix-intro/\n",
    "\n",
    "# 芝加哥期权交易所(Cboe) 波动率指数（简称VIX），用于预测美国股市在不久的将来可能高于\n",
    "# 和低于其当前水平的波动范围。具体而言，VIX 衡量标普 500®指数 (SPX)未来 30 天的隐含波动率。\n",
    "# 当隐含波动率处于高水平时，VIX数值会相应地提高，可能值范围亦较为宽阔。\n",
    "# 当隐含波动率处于低水平时，则 VIX数值会相应降低，可能值范围亦较为狭窄。\n",
    "\n",
    "# 由于股市最不稳定时VIX会升至最高水平，所以媒体倾向将 VIX称为恐慌指标。\n",
    "# 这名称正好反映VIX如何衡量市场情绪，尤其是市场的担忧虑情绪。\n",
    "\n",
    "insample_risk_indicator.vix.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "id": "BDkszkMloRWT",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "974ce481-5dd3-48dd-c707-7d42cfeb4453",
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "64.56692082214343"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 67
    }
   ],
   "source": [
    "insample_risk_indicator.vix.quantile(0.996)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "id": "AL7hs7svnNWT",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "d67c4027-e811-4b7d-dbee-729d4c78ebae",
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "count    1654.000000\nmean       40.860017\nstd        51.973844\nmin         2.490455\n25%        17.299122\n50%        26.440174\n75%        44.575623\nmax       652.507328\nName: turbulence, dtype: float64"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 68
    }
   ],
   "source": [
    "# 查看动荡指数 （通过finRL库进行计算得到）\n",
    "# 参考资料：\n",
    "#  https://portfoliooptimizer.io/blog/the-turbulence-index-measuring-financial-risk/\n",
    "#  https://blog.csdn.net/weixin_38754123/article/details/124358040\n",
    "\n",
    "# 动荡指数（The Turbulence Index）是衡量统计异常程度的指标，它既考虑了回报率的大小，\n",
    "# 也考虑了它们之间的相互作用。\n",
    "\n",
    "# 动荡指数量化了给定资产范围内异常行为的程度。其背后的解释是，资产回报率、\n",
    "# 波动性和相关性，它们与历史正常状态的差异越大，就越有可能是某个重大市场事件造成的，\n",
    "# 而不是随机噪声。\n",
    "\n",
    "insample_risk_indicator.turbulence.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "id": "N78hfHckoqJ9",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "051a7880-9702-4110-a801-33b0b0df3cd4",
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "426.47786559550553"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 69
    }
   ],
   "source": [
    "# 分位数（Quantile），亦称分位点，是指将一个随机变量的概率分布范围分为几个等份的数值点，\n",
    "# 常用的有中位数（即二分位数）、四分位数、百分位数等\n",
    "insample_risk_indicator.turbulence.quantile(0.996)"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 3. 回测\n",
    "## 3.1 强化学习回测"
   ],
   "metadata": {
    "id": "qu4Ey54b36oL"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "# 选择使用的强化学习策略\n",
    "if_using_a2c = True\n",
    "if_using_ddpg = False\n",
    "if_using_ppo = False\n",
    "if_using_td3 = False\n",
    "if_using_sac = True\n",
    "\n",
    "# 加载模型\n",
    "trained_a2c = A2C.load(os.path.join(TRAINED_MODEL_DIR, 'a2c', \"agent_a2c.zip\")) if if_using_a2c else None\n",
    "trained_ddpg = DDPG.load(os.path.join(TRAINED_MODEL_DIR, 'ddpg', \"agent_ddpg.zip\")) if if_using_ddpg else None\n",
    "trained_ppo = PPO.load(os.path.join(TRAINED_MODEL_DIR, 'ppo', \"agent_ppo.zip\")) if if_using_ppo else None\n",
    "trained_td3 = TD3.load(os.path.join(TRAINED_MODEL_DIR, 'td3', \"agent_td3.zip\")) if if_using_td3 else None\n",
    "trained_sac = SAC.load(os.path.join(TRAINED_MODEL_DIR, 'sac', \"agent_sac.zip\")) if if_using_sac else None"
   ],
   "metadata": {
    "id": "6CagrX0I36ZN",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 70,
   "outputs": [
    {
     "name": "stderr",
     "text": [
      "D:\\ProgramFiles\\anaconda3\\lib\\site-packages\\stable_baselines3\\common\\save_util.py:166: UserWarning: Could not deserialize object lr_schedule. Consider using `custom_objects` argument to replace this object.\n",
      "Exception: Can't get attribute '_make_function' on <module 'cloudpickle.cloudpickle' from 'D:\\\\ProgramFiles\\\\anaconda3\\\\lib\\\\site-packages\\\\cloudpickle\\\\cloudpickle.py'>\n",
      "  warnings.warn(\n"
     ],
     "output_type": "stream"
    }
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "U5mmgQF_h1jQ"
   },
   "source": [
    "交易（集外性能验证）\n",
    "- 周期性更新以利用好数据，比如，每季度、每月、或每周重新训练模型，并进行调参优化\n",
    "- 在这个notebook中，使用2009-01到2020-07的数据调参，因此一些因子随着时间衰减\n",
    "- 大量的超参影响学习过程，同时决定了测试的性能"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "# 共29支股票，状态空间291\n",
    "stock_dimension = len(trade.tic.unique())\n",
    "# 状态说明\n",
    "# 1：账户余额\n",
    "# [1: stock_dimension+1]: 股票价格\n",
    "# [stock_dimension+1: 1 + 2*stock_dimension]: 持仓数量\n",
    "# len(INDICATORS)*stock_dimension：每支股票的因子状态，bool型表示\n",
    "state_space = 1 + 2*stock_dimension + len(INDICATORS)*stock_dimension\n",
    "print(f\"Stock Dimension: {stock_dimension}, State Space: {state_space}\")"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "4H_w3SaBAkKU",
    "outputId": "5d77ffb1-e995-4224-e9d4-36f4fe000b18",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 71,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "Stock Dimension: 29, State Space: 291\n"
     ],
     "output_type": "stream"
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "buy_cost_list = sell_cost_list = [0.001] * stock_dimension  # 交易手续费\n",
    "num_stock_shares = [0] * stock_dimension\n",
    "\n",
    "env_kwargs = {\n",
    "    \"hmax\": 100,  # actions initially is scaled between 0 to 1\n",
    "    \"initial_amount\": 1000000,\n",
    "    \"num_stock_shares\": num_stock_shares,\n",
    "    \"buy_cost_pct\": buy_cost_list,\n",
    "    \"sell_cost_pct\": sell_cost_list,\n",
    "    \"state_space\": state_space,\n",
    "    \"stock_dim\": stock_dimension,\n",
    "    \"tech_indicator_list\": INDICATORS,\n",
    "    \"action_space\": stock_dimension,\n",
    "    \"reward_scaling\": 1e-4\n",
    "}"
   ],
   "metadata": {
    "id": "nKNmQMqGAknW",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 72,
   "outputs": []
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "id": "cIqoV0GSI52v",
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [],
   "source": [
    "# todo: ? 训练和测试不一致：测试中引入了波动率及阈值\n",
    "e_trade_gym = StockTradingEnv(df = trade, turbulence_threshold = 70,risk_indicator_col='vix', **env_kwargs)\n",
    "# env_trade, obs_trade = e_trade_gym.get_sb_env()"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "df_account_value_a2c, df_actions_a2c = DRLAgent.DRL_prediction(\n",
    "    model=trained_a2c, \n",
    "    environment = e_trade_gym) if if_using_a2c else (None, None)"
   ],
   "metadata": {
    "id": "lbFchno5j3xs",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 74,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "hit end!\n"
     ],
     "output_type": "stream"
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "df_account_value_ddpg, df_actions_ddpg = DRLAgent.DRL_prediction(\n",
    "    model=trained_ddpg, \n",
    "    environment = e_trade_gym) if if_using_ddpg else (None, None)"
   ],
   "metadata": {
    "id": "JbYljWGjj3pH",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 75,
   "outputs": []
  },
  {
   "cell_type": "code",
   "source": [
    "df_account_value_ppo, df_actions_ppo = DRLAgent.DRL_prediction(\n",
    "    model=trained_ppo, \n",
    "    environment = e_trade_gym) if if_using_ppo else (None, None)"
   ],
   "metadata": {
    "id": "74jNP2DBj3hb",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 76,
   "outputs": []
  },
  {
   "cell_type": "code",
   "source": [
    "df_account_value_td3, df_actions_td3 = DRLAgent.DRL_prediction(\n",
    "    model=trained_td3, \n",
    "    environment = e_trade_gym) if if_using_td3 else (None, None)"
   ],
   "metadata": {
    "id": "S7VyGGJPj3SH",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 77,
   "outputs": []
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "id": "eLOnL5eYh1jR",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "70e50e24-aed5-49f9-cdd7-de6b9689d9ce",
    "pycharm": {
     "is_executing": false
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "hit end!\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "df_account_value_sac, df_actions_sac = DRLAgent.DRL_prediction(\n",
    "    model=trained_sac, \n",
    "    environment = e_trade_gym) if if_using_sac else (None, None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GcE-t08w6DaW"
   },
   "source": [
    "## 3.2 对比基线：最大化均值方差\n",
    "\n",
    "- 作者：Dr G A Vijayalakshmi Pai\n",
    "- 参考代码：https://www.kaggle.com/code/vijipai/lesson-5-mean-variance-optimization-of-portfolios/notebook\n",
    "\n",
    "最大化均值方差（Mean Variance optimization）是一个非常经典的投资组合管理策略。"
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "# 处理mvo表\n",
    "def process_df_for_mvo(df):\n",
    "    df = df.sort_values(['date','tic'],ignore_index=True)[['date','tic','close']]\n",
    "    fst = df\n",
    "    fst = fst.iloc[0:stock_dimension, :]  # 取交易日第1天的29支股票\n",
    "    tic = fst['tic'].tolist()  # 获取股票列表\n",
    "    \n",
    "    mvo = pd.DataFrame()\n",
    "    \n",
    "    # 初始化每个股票的mvo值为0\n",
    "    for k in range(len(tic)):\n",
    "        mvo[tic[k]] = 0\n",
    "    \n",
    "    # 按交易日，一天一天遍历，每次取29支股票\n",
    "    # 生成列表，列是29值股票，行索引是日期，填充是收盘价\n",
    "    for i in range(df.shape[0]//stock_dimension):\n",
    "        n = df\n",
    "        n = n.iloc[i * stock_dimension:(i+1) * stock_dimension, :]\n",
    "        date = n['date'][i*stock_dimension]\n",
    "        mvo.loc[date] = n['close'].tolist()\n",
    "    \n",
    "    return mvo\n",
    "\n",
    "\n",
    "# 平均收益率与方差-协方差矩阵\n",
    "def StockReturnsComputing(StockPrice, Rows, Columns): \n",
    "    import numpy as np \n",
    "    StockReturn = np.zeros([Rows-1, Columns]) \n",
    "    for j in range(Columns):        # j: Assets \n",
    "        for i in range(Rows-1):     # i: Daily Prices \n",
    "            # 通过前后2天的差值计算收益\n",
    "            StockReturn[i,j]=((StockPrice[i+1, j]-StockPrice[i,j])/StockPrice[i,j])* 100 \n",
    "      \n",
    "    return StockReturn"
   ],
   "metadata": {
    "id": "Sizh4M2sheoa",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 79,
   "outputs": []
  },
  {
   "cell_type": "code",
   "source": [
    "# 计算均值方差权重\n",
    "StockData = process_df_for_mvo(train)\n",
    "TradeData = process_df_for_mvo(trade)\n",
    "\n",
    "TradeData.to_numpy()  # 即取消表头和索引\n"
   ],
   "metadata": {
    "id": "PcWquxuQ4_H5",
    "pycharm": {
     "name": "#%% \n",
     "is_executing": false
    }
   },
   "execution_count": 80,
   "outputs": [
    {
     "data": {
      "text/plain": "array([[ 89.495, 236.683,  91.078, ...,  47.767,  36.77 , 115.097],\n       [ 89.495, 239.578,  91.35 , ...,  47.872,  37.76 , 114.636],\n       [ 91.889, 237.732,  93.529, ...,  48.265,  38.821, 114.328],\n       ...,\n       [147.342, 199.597, 179.354, ...,  49.08 ,  46.593, 147.145],\n       [148.016, 200.606, 178.016, ...,  49.546,  45.732, 145.861],\n       [147.55 , 198.588, 175.143, ...,  49.126,  44.605, 144.664]])"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 80
    }
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "Mean returns of assets in k-portfolio 1\n",
      " [0.136 0.068 0.086 0.083 0.066 0.134 0.06  0.035 0.072 0.056 0.103 0.073\n",
      " 0.033 0.076 0.047 0.073 0.042 0.056 0.054 0.056 0.103 0.089 0.041 0.053\n",
      " 0.104 0.11  0.044 0.042 0.042]\n",
      "Variance-Covariance matrix of returns\n",
      " [[3.156 1.066 1.768 1.669 1.722 1.814 1.569 1.302 1.302 1.811 1.303 1.432\n",
      "  1.218 1.674 0.74  1.839 0.719 0.884 1.241 0.823 1.561 1.324 0.752 1.027\n",
      "  1.298 1.466 0.657 1.078 0.631]\n",
      " [1.066 2.571 1.306 1.123 1.193 1.319 1.116 1.053 1.045 1.269 1.068 1.089\n",
      "  0.899 1.218 0.926 1.391 0.682 0.727 1.025 1.156 1.166 0.984 0.798 0.956\n",
      "  1.259 1.111 0.688 1.091 0.682]\n",
      " [1.768 1.306 4.847 2.73  2.6   2.128 1.944 2.141 2.17  3.142 1.932 2.283\n",
      "  1.56  2.012 0.993 3.707 1.094 1.319 1.845 1.236 1.899 1.894 1.041 1.921\n",
      "  1.823 2.314 0.986 1.421 0.707]\n",
      " [1.669 1.123 2.73  4.892 2.363 1.979 1.7   2.115 1.959 2.387 1.773 2.319\n",
      "  1.571 1.797 0.968 2.597 1.144 1.298 1.643 1.071 1.615 1.775 0.91  1.666\n",
      "  1.707 1.784 0.82  1.345 0.647]\n",
      " [1.722 1.193 2.6   2.363 4.019 2.127 1.917 2.059 1.817 2.46  1.577 2.238\n",
      "  1.513 1.929 0.925 2.64  0.947 0.971 1.894 1.089 1.711 1.642 0.865 1.456\n",
      "  1.478 1.687 0.92  1.326 0.697]\n",
      " [1.814 1.319 2.128 1.979 2.127 5.384 1.974 1.549 1.683 2.122 1.624 1.771\n",
      "  1.441 1.939 0.846 2.191 0.837 1.075 1.475 1.041 1.978 1.768 0.784 1.328\n",
      "  1.365 1.912 0.787 1.28  0.666]\n",
      " [1.569 1.116 1.944 1.7   1.917 1.974 3.081 1.483 1.534 1.937 1.367 1.62\n",
      "  1.399 1.843 0.894 2.057 0.794 0.905 1.438 1.014 1.72  1.382 0.865 1.206\n",
      "  1.273 1.488 0.811 1.173 0.753]\n",
      " [1.302 1.053 2.141 2.115 2.059 1.549 1.483 2.842 1.525 2.044 1.428 1.783\n",
      "  1.308 1.533 0.878 2.279 0.938 1.092 1.385 1.078 1.429 1.314 0.831 1.459\n",
      "  1.466 1.48  0.83  1.042 0.567]\n",
      " [1.302 1.045 2.17  1.959 1.817 1.683 1.534 1.525 2.661 1.987 1.454 1.748\n",
      "  1.217 1.475 0.791 2.216 0.896 0.973 1.396 0.949 1.379 1.407 0.859 1.268\n",
      "  1.281 1.454 0.81  1.143 0.667]\n",
      " [1.811 1.269 3.142 2.387 2.46  2.122 1.937 2.044 1.987 4.407 1.789 2.12\n",
      "  1.593 1.982 0.945 3.96  0.956 1.094 1.758 1.157 1.788 1.692 0.905 1.879\n",
      "  1.712 2.    0.945 1.421 0.713]\n",
      " [1.303 1.068 1.932 1.773 1.577 1.624 1.367 1.428 1.454 1.789 2.373 1.51\n",
      "  1.166 1.501 0.756 1.941 0.824 0.998 1.239 0.887 1.366 1.414 0.797 1.299\n",
      "  1.296 1.41  0.764 1.071 0.783]\n",
      " [1.432 1.089 2.283 2.319 2.238 1.771 1.62  1.783 1.748 2.12  1.51  2.516\n",
      "  1.326 1.575 0.889 2.345 0.958 1.022 1.623 1.02  1.489 1.532 0.848 1.377\n",
      "  1.444 1.547 0.81  1.211 0.63 ]\n",
      " [1.218 0.899 1.56  1.571 1.513 1.441 1.399 1.308 1.217 1.593 1.166 1.326\n",
      "  2.052 1.399 0.727 1.749 0.786 0.795 1.154 0.829 1.296 1.12  0.743 1.105\n",
      "  1.088 1.214 0.739 0.998 0.598]\n",
      " [1.674 1.218 2.012 1.797 1.929 1.939 1.843 1.533 1.475 1.982 1.501 1.575\n",
      "  1.399 3.289 0.853 2.112 0.85  0.89  1.412 1.002 1.9   1.352 0.842 1.317\n",
      "  1.334 1.487 0.847 1.165 0.766]\n",
      " [0.74  0.926 0.993 0.968 0.925 0.846 0.894 0.878 0.791 0.945 0.756 0.889\n",
      "  0.727 0.853 1.153 1.027 0.642 0.59  0.848 0.892 0.825 0.748 0.694 0.761\n",
      "  0.929 0.819 0.61  0.806 0.547]\n",
      " [1.839 1.391 3.707 2.597 2.64  2.191 2.057 2.279 2.216 3.96  1.941 2.345\n",
      "  1.749 2.112 1.027 5.271 1.08  1.235 1.892 1.297 1.91  1.85  1.068 2.164\n",
      "  1.85  2.169 1.112 1.555 0.779]\n",
      " [0.719 0.682 1.094 1.144 0.947 0.837 0.794 0.938 0.896 0.956 0.824 0.958\n",
      "  0.786 0.85  0.642 1.08  1.264 0.679 0.804 0.74  0.819 0.845 0.749 0.891\n",
      "  0.849 0.794 0.633 0.719 0.514]\n",
      " [0.884 0.727 1.319 1.298 0.971 1.075 0.905 1.092 0.973 1.094 0.998 1.022\n",
      "  0.795 0.89  0.59  1.235 0.679 1.518 0.816 0.719 0.943 1.027 0.615 1.\n",
      "  0.947 0.994 0.533 0.673 0.504]\n",
      " [1.241 1.025 1.845 1.643 1.894 1.475 1.438 1.385 1.396 1.758 1.239 1.623\n",
      "  1.154 1.412 0.848 1.892 0.804 0.816 2.028 0.9   1.265 1.243 0.787 1.194\n",
      "  1.193 1.282 0.752 1.099 0.622]\n",
      " [0.823 1.156 1.236 1.071 1.089 1.041 1.014 1.078 0.949 1.157 0.887 1.02\n",
      "  0.829 1.002 0.892 1.297 0.74  0.719 0.9   2.007 0.952 0.849 0.732 1.008\n",
      "  1.15  0.933 0.722 0.897 0.614]\n",
      " [1.561 1.166 1.899 1.615 1.711 1.978 1.72  1.429 1.379 1.788 1.366 1.489\n",
      "  1.296 1.9   0.825 1.91  0.819 0.943 1.265 0.952 2.759 1.308 0.832 1.214\n",
      "  1.285 1.493 0.793 1.113 0.705]\n",
      " [1.324 0.984 1.894 1.775 1.642 1.768 1.382 1.314 1.407 1.692 1.414 1.532\n",
      "  1.12  1.352 0.748 1.85  0.845 1.027 1.243 0.849 1.308 2.864 0.751 1.153\n",
      "  1.26  1.411 0.71  1.046 0.651]\n",
      " [0.752 0.798 1.041 0.91  0.865 0.784 0.865 0.831 0.859 0.905 0.797 0.848\n",
      "  0.743 0.842 0.694 1.068 0.749 0.615 0.787 0.732 0.832 0.751 1.289 0.806\n",
      "  0.766 0.763 0.663 0.797 0.645]\n",
      " [1.027 0.956 1.921 1.666 1.456 1.328 1.206 1.459 1.268 1.879 1.299 1.377\n",
      "  1.105 1.317 0.761 2.164 0.891 1.    1.194 1.008 1.214 1.153 0.806 2.27\n",
      "  1.259 1.294 0.812 0.986 0.676]\n",
      " [1.298 1.259 1.823 1.707 1.478 1.365 1.273 1.466 1.281 1.712 1.296 1.444\n",
      "  1.088 1.334 0.929 1.85  0.849 0.947 1.193 1.15  1.285 1.26  0.766 1.259\n",
      "  3.352 1.267 0.697 1.137 0.685]\n",
      " [1.466 1.111 2.314 1.784 1.687 1.912 1.488 1.48  1.454 2.    1.41  1.547\n",
      "  1.214 1.487 0.819 2.169 0.794 0.994 1.282 0.933 1.493 1.411 0.763 1.294\n",
      "  1.267 2.982 0.709 1.007 0.656]\n",
      " [0.657 0.688 0.986 0.82  0.92  0.787 0.811 0.83  0.81  0.945 0.764 0.81\n",
      "  0.739 0.847 0.61  1.112 0.633 0.533 0.752 0.722 0.793 0.71  0.663 0.812\n",
      "  0.697 0.709 1.371 0.697 0.561]\n",
      " [1.078 1.091 1.421 1.345 1.326 1.28  1.173 1.042 1.143 1.421 1.071 1.211\n",
      "  0.998 1.165 0.806 1.555 0.719 0.673 1.099 0.897 1.113 1.046 0.797 0.986\n",
      "  1.137 1.007 0.697 3.073 0.759]\n",
      " [0.631 0.682 0.707 0.647 0.697 0.666 0.753 0.567 0.667 0.713 0.783 0.63\n",
      "  0.598 0.766 0.547 0.779 0.514 0.504 0.622 0.614 0.705 0.651 0.645 0.676\n",
      "  0.685 0.656 0.561 0.759 1.452]]\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "# 计算资产收益\n",
    "arStockPrices = np.asarray(StockData)  # 维度（2893， 29）\n",
    "[Rows, Cols]=arStockPrices.shape\n",
    "arReturns = StockReturnsComputing(arStockPrices, Rows, Cols)  # 维度（2893， 29）\n",
    "\n",
    "# 计算平均收益和收益的方差-协方差矩阵\n",
    "meanReturns = np.mean(arReturns, axis = 0)   # 维度（29）\n",
    "covReturns = np.cov(arReturns, rowvar=False)  # 维度（29， 29）\n",
    " \n",
    "# 设置打印保留的精度\n",
    "np.set_printoptions(precision=3, suppress = True)\n",
    "\n",
    "# 显示平均收益和收益的方差-协方差矩阵\n",
    "print('Mean returns of assets in k-portfolio 1\\n', meanReturns)\n",
    "print('Variance-Covariance matrix of returns\\n', covReturns)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "使用 PyPortfolioOpt\n",
    "\n",
    "PyPortfolioOpt是一个实现投资组合优化方法的库，其中包括经典的均值方差优化技术和Black-Litterman\n",
    "资产配置模型，以及该领域的最新进展，例如收缩率shrinkage和层次风险平价模型\n",
    "Hierarchical Risk Parity，以及一些新颖的实验功能，例如指数加权协方差矩阵。\n",
    "\n",
    "马科维兹有效前沿(efficient_frontier)\n",
    "\n",
    "有效前沿亦称“有效边界”。理性的投资者一般是厌恶风险而偏好收益的，\n",
    "对于相同的风险水平，会选择能提供最大收益率的组合；对于相同的预期收益率，\n",
    "会选择风险最小的组合。能同时满足这些条件的投资组合就是有效前沿。\n",
    "\n",
    "“现代投资组合理论”（MPT）是1952年哈里.马克维茨在金融期刊上发表的名为\n",
    "“Portfolio Selection”的文章上提出的投资理论。\n",
    "\n",
    "虽然在一个投资组合的收益为所有股票收益的平均值/加权平均值，\n",
    "但这个投资组合的风险不等于投资组合里所有股票风险的平均值/加权平均值。\n",
    "风险就是指一个资产的变化情况，如果在你的投资组合里有多只股票，\n",
    "那么你就需要计算一下这些股票之间变化的相关性。多样性的好处在于，\n",
    "你可以通过优化资产配置，使得该投资组合的风险低于投资组合中风险最低的股票的风险。\n",
    "\n",
    "\n",
    "参考：https://blog.csdn.net/jirox/article/details/116406486"
   ],
   "metadata": {
    "id": "IeVVbuwveJ_5"
   }
  },
  {
   "cell_type": "code",
   "source": [
    "from pypfopt.efficient_frontier import EfficientFrontier\n",
    "\n",
    "# 计算马科维兹有效前沿，获取最大化均值方差\n",
    "ef_mean = EfficientFrontier(meanReturns, covReturns, weight_bounds=(0, 0.5))\n",
    "raw_weights_mean = ef_mean.max_sharpe()\n",
    "cleaned_weights_mean = ef_mean.clean_weights()\n",
    "# 初始资金乘以权重\n",
    "mvo_weights = np.array([1000000 * cleaned_weights_mean[i] for i in range(29)])\n",
    "mvo_weights"
   ],
   "metadata": {
    "id": "b1btTONEdCU4",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 82,
   "outputs": [
    {
     "data": {
      "text/plain": "array([424250.,      0.,      0.,      0.,      0., 108650.,      0.,\n            0.,      0.,      0., 181450.,      0.,      0.,      0.,\n            0.,      0.,      0.,      0.,      0.,      0.,  16960.,\n            0.,      0.,      0., 133540., 135150.,      0.,      0.,\n            0.])"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 82
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "# 通过资金分配除以最后交易日的价格，获取初始持仓组合\n",
    "LastPrice = np.array([1/p for p in StockData.tail(1).to_numpy()[0]])\n",
    "Initial_Portfolio = np.multiply(mvo_weights, LastPrice)\n",
    "Initial_Portfolio"
   ],
   "metadata": {
    "id": "F38NJRJJgOmj",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "e39c30b1-2367-4119-d07e-e1861ba04b19",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 83,
   "outputs": [
    {
     "data": {
      "text/plain": "array([4731.544,    0.   ,    0.   ,    0.   ,    0.   ,  579.993,\n          0.   ,    0.   ,    0.   ,    0.   ,  766.21 ,    0.   ,\n          0.   ,    0.   ,    0.   ,    0.   ,    0.   ,    0.   ,\n          0.   ,    0.   ,   85.251,    0.   ,    0.   ,    0.   ,\n        468.596,  712.801,    0.   ,    0.   ,    0.   ])"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 83
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "# 它与numpy.dot（）的作用是一样的，矩阵乘法\n",
    "Portfolio_Assets = TradeData @ Initial_Portfolio\n",
    "# 获取每一交易日的总投资组合资产\n",
    "MVO_result = pd.DataFrame(Portfolio_Assets, columns=[\"Mean Var\"])\n",
    "MVO_result"
   ],
   "metadata": {
    "id": "ZAd1iXqZhQ6X",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "8456d6c3-78d3-4e4c-cbc0-0c13fc56adef",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 84,
   "outputs": [
    {
     "data": {
      "text/plain": "                Mean Var\n2020-07-01  1.001917e+06\n2020-07-02  1.004234e+06\n2020-07-06  1.023225e+06\n2020-07-07  1.014021e+06\n2020-07-08  1.029461e+06\n...                  ...\n2021-10-21  1.533022e+06\n2021-10-22  1.535667e+06\n2021-10-25  1.542077e+06\n2021-10-26  1.545514e+06\n2021-10-27  1.534916e+06\n\n[335 rows x 1 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Mean Var</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2020-07-01</th>\n      <td>1.001917e+06</td>\n    </tr>\n    <tr>\n      <th>2020-07-02</th>\n      <td>1.004234e+06</td>\n    </tr>\n    <tr>\n      <th>2020-07-06</th>\n      <td>1.023225e+06</td>\n    </tr>\n    <tr>\n      <th>2020-07-07</th>\n      <td>1.014021e+06</td>\n    </tr>\n    <tr>\n      <th>2020-07-08</th>\n      <td>1.029461e+06</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>2021-10-21</th>\n      <td>1.533022e+06</td>\n    </tr>\n    <tr>\n      <th>2021-10-22</th>\n      <td>1.535667e+06</td>\n    </tr>\n    <tr>\n      <th>2021-10-25</th>\n      <td>1.542077e+06</td>\n    </tr>\n    <tr>\n      <th>2021-10-26</th>\n      <td>1.545514e+06</td>\n    </tr>\n    <tr>\n      <th>2021-10-27</th>\n      <td>1.534916e+06</td>\n    </tr>\n  </tbody>\n</table>\n<p>335 rows × 1 columns</p>\n</div>"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 84
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 3.3: 道琼斯指数(DJIA index)下载"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "outputs": [],
   "source": [
    "# 由于国内无法使用YahooDownloader，暂时注释如下部分\n",
    "TRAIN_START_DATE = '2009-01-01'\n",
    "TRAIN_END_DATE = '2020-07-01'\n",
    "TRADE_START_DATE = '2020-07-01'\n",
    "TRADE_END_DATE = '2021-10-29'\n",
    "\n",
    "# from finrl.meta.preprocessor.yahoodownloader import YahooDownloader\n",
    "# df_dji = YahooDownloader(start_date = TRADE_START_DATE,\n",
    "#                      end_date = TRADE_END_DATE,\n",
    "#                      ticker_list = ['dji']).fetch_data()\n",
    "# \n",
    "# df_dji"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "outputs": [],
   "source": [
    "# df_dji = df_dji[['date','close']]\n",
    "# fst_day = df_dji['close'][0]\n",
    "# dji = pd.merge(df_dji['date'], df_dji['close'].div(fst_day).mul(1000000), \n",
    "#                how='outer', left_index=True, right_index=True).set_index('date')\n",
    "# dji\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "W6vvNSC6h1jZ"
   },
   "source": [
    "<a id='6'></a>\n",
    "# 4. 性能对比\n",
    "\n",
    "## 4.1 对比基线和强化学习\n",
    "\n",
    "使用Quantopian pyfolio工具进行回测\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "df_result_a2c = df_account_value_a2c.set_index(df_account_value_a2c.columns[0]) if if_using_a2c else None\n",
    "df_result_ddpg = df_account_value_ddpg.set_index(df_account_value_ddpg.columns[0]) if if_using_ddpg else None\n",
    "df_result_ppo = df_account_value_ppo.set_index(df_account_value_ppo.columns[0]) if if_using_ppo else None\n",
    "df_result_td3 = df_account_value_td3.set_index(df_account_value_td3.columns[0]) if if_using_td3 else None\n",
    "df_result_sac = df_account_value_sac.set_index(df_account_value_sac.columns[0]) if if_using_sac else None\n",
    "\n",
    "# 将强化学习和最大化均值方差结果合入一个表，进行对比\n",
    "result = pd.DataFrame()\n",
    "if if_using_a2c: result = pd.merge(result, df_result_a2c, how='outer', left_index=True, right_index=True)\n",
    "if if_using_ddpg: result = pd.merge(result, df_result_ddpg, how='outer', left_index=True, right_index=True)\n",
    "if if_using_ppo: result = pd.merge(result, df_result_ppo, how='outer', left_index=True, right_index=True)\n",
    "if if_using_td3: result = pd.merge(result, df_result_td3, how='outer', left_index=True, right_index=True)\n",
    "if if_using_sac: result = pd.merge(result, df_result_sac, how='outer', left_index=True, right_index=True)\n",
    "result = pd.merge(result, MVO_result, how='outer', left_index=True, right_index=True)\n",
    "# result = pd.merge(result, dji, how='outer', left_index=True, right_index=True).fillna(method='bfill')"
   ],
   "metadata": {
    "id": "KeDeGAc9VrEg",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 87,
   "outputs": []
  },
  {
   "cell_type": "code",
   "source": [
    "# 修改列名\n",
    "col_name = []\n",
    "col_name.append('A2C') if if_using_a2c else None\n",
    "col_name.append('DDPG') if if_using_ddpg else None\n",
    "col_name.append('PPO') if if_using_ppo else None\n",
    "col_name.append('TD3') if if_using_td3 else None\n",
    "col_name.append('SAC') if if_using_sac else None\n",
    "col_name.append('Mean Var')\n",
    "# col_name.append('djia') \n",
    "result.columns = col_name"
   ],
   "metadata": {
    "id": "JvlTVQwsiMyx",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 88,
   "outputs": []
  },
  {
   "cell_type": "code",
   "source": [
    "result"
   ],
   "metadata": {
    "id": "l4FZxyDt3XaE",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 455
    },
    "outputId": "bcbd724b-189b-4e99-d6fd-9a8bacde709d",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 89,
   "outputs": [
    {
     "data": {
      "text/plain": "                     A2C           SAC      Mean Var\ndate                                                \n2020-07-01  1.000000e+06  1.000000e+06  1.001917e+06\n2020-07-02  1.000943e+06  1.000534e+06  1.004234e+06\n2020-07-06  1.006884e+06  1.006289e+06  1.023225e+06\n2020-07-07  9.960292e+05  9.979052e+05  1.014021e+06\n2020-07-08  1.001440e+06  1.001714e+06  1.029461e+06\n...                  ...           ...           ...\n2021-10-21  1.771517e+06  1.316362e+06  1.533022e+06\n2021-10-22  1.778274e+06  1.320957e+06  1.535667e+06\n2021-10-25  1.779493e+06  1.327333e+06  1.542077e+06\n2021-10-26  1.787692e+06  1.324652e+06  1.545514e+06\n2021-10-27  1.761977e+06  1.316038e+06  1.534916e+06\n\n[335 rows x 3 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>A2C</th>\n      <th>SAC</th>\n      <th>Mean Var</th>\n    </tr>\n    <tr>\n      <th>date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2020-07-01</th>\n      <td>1.000000e+06</td>\n      <td>1.000000e+06</td>\n      <td>1.001917e+06</td>\n    </tr>\n    <tr>\n      <th>2020-07-02</th>\n      <td>1.000943e+06</td>\n      <td>1.000534e+06</td>\n      <td>1.004234e+06</td>\n    </tr>\n    <tr>\n      <th>2020-07-06</th>\n      <td>1.006884e+06</td>\n      <td>1.006289e+06</td>\n      <td>1.023225e+06</td>\n    </tr>\n    <tr>\n      <th>2020-07-07</th>\n      <td>9.960292e+05</td>\n      <td>9.979052e+05</td>\n      <td>1.014021e+06</td>\n    </tr>\n    <tr>\n      <th>2020-07-08</th>\n      <td>1.001440e+06</td>\n      <td>1.001714e+06</td>\n      <td>1.029461e+06</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>2021-10-21</th>\n      <td>1.771517e+06</td>\n      <td>1.316362e+06</td>\n      <td>1.533022e+06</td>\n    </tr>\n    <tr>\n      <th>2021-10-22</th>\n      <td>1.778274e+06</td>\n      <td>1.320957e+06</td>\n      <td>1.535667e+06</td>\n    </tr>\n    <tr>\n      <th>2021-10-25</th>\n      <td>1.779493e+06</td>\n      <td>1.327333e+06</td>\n      <td>1.542077e+06</td>\n    </tr>\n    <tr>\n      <th>2021-10-26</th>\n      <td>1.787692e+06</td>\n      <td>1.324652e+06</td>\n      <td>1.545514e+06</td>\n    </tr>\n    <tr>\n      <th>2021-10-27</th>\n      <td>1.761977e+06</td>\n      <td>1.316038e+06</td>\n      <td>1.534916e+06</td>\n    </tr>\n  </tbody>\n</table>\n<p>335 rows × 3 columns</p>\n</div>"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 89
    }
   ]
  },
  {
   "cell_type": "code",
   "source": [
    "# 绘图对比总资产变化\n",
    "plt.rcParams[\"figure.figsize\"] = (15,5)\n",
    "plt.figure()\n",
    "result.plot()"
   ],
   "metadata": {
    "id": "6xRfrqK4RVfq",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 381
    },
    "outputId": "fed27564-5097-4f04-cb78-ed3728794f95",
    "pycharm": {
     "is_executing": false
    }
   },
   "execution_count": 90,
   "outputs": [
    {
     "data": {
      "text/plain": "<AxesSubplot:xlabel='date'>"
     },
     "metadata": {},
     "output_type": "execute_result",
     "execution_count": 90
    },
    {
     "data": {
      "text/plain": "<Figure size 1080x360 with 0 Axes>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 1080x360 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 4.2 计算详细回测指标"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "outputs": [
    {
     "name": "stdout",
     "text": [
      "==============Get Backtest Results===========\n",
      "\n",
      " a2c:\n",
      "Annual return          0.531267\n",
      "Cumulative returns     0.761977\n",
      "Annual volatility      0.207082\n",
      "Sharpe ratio           2.168219\n",
      "Calmar ratio           5.108832\n",
      "Stability              0.913644\n",
      "Max drawdown          -0.103990\n",
      "Omega ratio            1.434179\n",
      "Sortino ratio          3.603966\n",
      "Skew                        NaN\n",
      "Kurtosis                    NaN\n",
      "Tail ratio             1.140148\n",
      "Daily value at risk   -0.024308\n",
      "dtype: float64\n",
      "\n",
      " sac:\n",
      "Annual return          0.229471\n",
      "Cumulative returns     0.316038\n",
      "Annual volatility      0.135545\n",
      "Sharpe ratio           1.597028\n",
      "Calmar ratio           2.503250\n",
      "Stability              0.885632\n",
      "Max drawdown          -0.091669\n",
      "Omega ratio            1.300750\n",
      "Sortino ratio          2.291562\n",
      "Skew                        NaN\n",
      "Kurtosis                    NaN\n",
      "Tail ratio             1.029162\n",
      "Daily value at risk   -0.016218\n",
      "dtype: float64\n"
     ],
     "output_type": "stream"
    },
    {
     "name": "stderr",
     "text": [
      "D:\\ProgramFiles\\anaconda3\\lib\\site-packages\\pyfolio\\timeseries.py:724: FutureWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.\n",
      "  stats = pd.Series()\n",
      "D:\\ProgramFiles\\anaconda3\\lib\\site-packages\\pyfolio\\timeseries.py:724: FutureWarning: The default dtype for empty Series will be 'object' instead of 'float64' in a future version. Specify a dtype explicitly to silence this warning.\n",
      "  stats = pd.Series()\n"
     ],
     "output_type": "stream"
    }
   ],
   "source": [
    "print(\"==============Get Backtest Results===========\")\n",
    "now = datetime.datetime.now().strftime('%Y%m%d-%Hh%M')\n",
    "\n",
    "if if_using_ppo:\n",
    "  print(\"\\n ppo:\")\n",
    "  perf_stats_all_ppo = backtest_stats(account_value=df_account_value_ppo)\n",
    "  perf_stats_all_ppo = pd.DataFrame(perf_stats_all_ppo)\n",
    "  perf_stats_all_ppo.to_csv(\"./\"+config.RESULTS_DIR+\"/perf_stats_all_ppo_\"+now+'.csv')\n",
    "\n",
    "if if_using_ddpg:\n",
    "  print(\"\\n ddpg:\")\n",
    "  perf_stats_all_ddpg = backtest_stats(account_value=df_account_value_ddpg)\n",
    "  perf_stats_all_ddpg = pd.DataFrame(perf_stats_all_ddpg)\n",
    "  perf_stats_all_ddpg.to_csv(\"./\"+config.RESULTS_DIR+\"/perf_stats_all_ddpg_\"+now+'.csv')\n",
    "\n",
    "if if_using_a2c:\n",
    "  print(\"\\n a2c:\")\n",
    "  perf_stats_all_a2c = backtest_stats(account_value=df_account_value_a2c)\n",
    "  perf_stats_all_a2c = pd.DataFrame(perf_stats_all_a2c)\n",
    "  perf_stats_all_a2c.to_csv(\"./\"+config.RESULTS_DIR+\"/perf_stats_all_a2c_\"+now+'.csv')\n",
    "\n",
    "if if_using_td3:\n",
    "  print(\"\\n atd3:\")\n",
    "  perf_stats_all_td3 = backtest_stats(account_value=df_account_value_td3)\n",
    "  perf_stats_all_td3 = pd.DataFrame(perf_stats_all_td3)\n",
    "  perf_stats_all_td3.to_csv(\"./\"+config.RESULTS_DIR+\"/perf_stats_all_td3_\"+now+'.csv')\n",
    "\n",
    "if if_using_sac:\n",
    "  print(\"\\n sac:\")\n",
    "  perf_stats_all_sac = backtest_stats(account_value=df_account_value_sac)\n",
    "  perf_stats_all_sac = pd.DataFrame(perf_stats_all_sac)\n",
    "  perf_stats_all_sac.to_csv(\"./\"+config.RESULTS_DIR+\"/perf_stats_all_sac_\"+now+'.csv')\n",
    "  "
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "outputs": [],
   "source": [
    "# 由于无法下载道尔琼斯指数，暂时注释掉了如下代码\n",
    "#baseline stats\n",
    "# print(\"==============Compare to DJIA===========\")\n",
    "# %matplotlib inline\n",
    "# # S&P 500: ^GSPC\n",
    "# # Dow Jones Index: ^DJI\n",
    "# # NASDAQ 100: ^NDX\n",
    "# backtest_plot(df_account_value, \n",
    "#              baseline_ticker = '^DJI', \n",
    "#              baseline_start = df_account_value.loc[0,'date'],\n",
    "#              baseline_end = df_account_value.loc[len(df_account_value)-1,'date'])"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 4.3 回测绘图"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "outputs": [],
   "source": [
    "# 由于无法下载道尔琼斯指数，暂时注释掉了如下代码\n",
    "# 获取详细和指数进行的统计对比报表以及分析图\n",
    "\n",
    "# print(\"==============Compare to DJIA===========\")\n",
    "# %matplotlib inline\n",
    "# # S&P 500: ^GSPC\n",
    "# # Dow Jones Index: ^DJI\n",
    "# # NASDAQ 100: ^NDX\n",
    "# \n",
    "# if if_using_ppo:\n",
    "#   backtest_plot(df_account_value_ppo, \n",
    "#               baseline_ticker = '^DJI', \n",
    "#               baseline_start = TEST_START_DATE,\n",
    "#               baseline_end = TEST_END_DATE)\n",
    "# \n",
    "# if if_using_ddpg:\n",
    "#   backtest_plot(df_account_value_ddpg, \n",
    "#               baseline_ticker = '^DJI', \n",
    "#               baseline_start = TEST_START_DATE,\n",
    "#               baseline_end = TEST_END_DATE)\n",
    "# \n",
    "# if if_using_a2c:\n",
    "#   backtest_plot(df_account_value_a2c, \n",
    "#               baseline_ticker = '^DJI', \n",
    "#               baseline_start = TEST_START_DATE,\n",
    "#               baseline_end = TEST_END_DATE)\n",
    "# \n",
    "# if if_using_td3:\n",
    "#   backtest_plot(df_account_value_td3, \n",
    "#               baseline_ticker = '^DJI', \n",
    "#               baseline_start = TEST_START_DATE,\n",
    "#               baseline_end = TEST_END_DATE)\n",
    "# \n",
    "# if if_using_sac:\n",
    "#   backtest_plot(df_account_value_sac, \n",
    "#               baseline_ticker = '^DJI', \n",
    "#               baseline_start = TEST_START_DATE,\n",
    "#               baseline_end = TEST_END_DATE)\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n",
     "is_executing": false
    }
   }
  }
 ]
}